"""
Vistas utilizadas 
"""
from pyramid.response import Response
from pyramid.renderers import render
import json
import re
from pyramid.httpexceptions import HTTPFound, HTTPNotFound
from pyramid.security import authenticated_userid

from alpha.modelos import DBSession
from alpha.modelos.models import Usuario
from alpha.modelos.models import Rol
from alpha.modelos.models import Proyecto
from alpha.modelos.models import AssociationRol


import transaction

"""
Redirije la raiz a la vista main
"""
def redirect(request):
    return HTTPFound(location = request.route_url('main'))

"""
Vista main, los usuarios autenticados pueden ver el contenido 
"""
def main(request):

    logged_in = authenticated_userid(request)
    return dict(
        logged_in = logged_in,
        )

"""
Vista usuarios, seccion donde se administra las operaciones referentes a los usuarios
"""
def usuarios(request):
    logged_in = authenticated_userid(request)
    return dict(
        logged_in = logged_in,

        )

"""
Vista roles, seccion donde se administra las operaciones referentes a los roles
"""
def roles(request):
    logged_in = authenticated_userid(request)
    return dict(
        logged_in = logged_in,

        )       

"""
Vista roles, seccion donde se administra las operaciones referentes a los roles
"""
def proyectos(request):
    logged_in = authenticated_userid(request)
    return dict(
        logged_in = logged_in,

        )             

def asignarRol(request):
	session = DBSession()
	post_data = request.POST
	output = json.dumps({'success': False})
	if 'submit' in post_data:
		rol= request.params['roles']
		id_usu= int( request.params['id_usuario'])
		rol = session.query(Rol).filter_by( nombreRol= rol).first() #selecciona el rol solicitado
		usu = session.query(Usuario).filter_by( id_usuario= id_usu).first() # selecciona el usuario indicado
		if (rol != None) and (usu != None):
			output = json.dumps({'success': True})
			aso= AssociationRol() # crea la asociacion, para muchos a muchos
			aso.rol= rol
			aso.left_id= usu.id_usuario # este era el error anterior, faltaba esta asignacion
			usu.asociacion.append(aso)# anhade la ascociacion (que contiene al rol) al usuario
			session.add(usu)
	return Response(output)   
 


def crearUsuarios(request):
    post_data = request.POST
    if 'submit' in post_data:
        nombreUsuario = post_data['nombreUsuario']
        password1 = post_data['password1']
        nombre = post_data['nombre']
        apellido= post_data['apellido']
        telefono= post_data['telefono']
        if telefono == "":
			telefono = 0
        nroDocumento= post_data['nroDocumento']
        if nroDocumento == "":
			nroDocumento = 0
        mail = post_data['email']
        transaction.begin()
        session = DBSession()
        usuario = Usuario(nombreUsuario, password1, nombre, apellido, telefono, nroDocumento, mail)
        session.add(usuario)
        transaction.commit()
        output = json.dumps({'success': True})
    return Response(output) 

def eliminarUsuarios(request):
    post_data = request.POST
    if 'submit' in post_data:
        session = DBSession()
        lista=[]
        idUsuario = int(request.params['id'])        
        for instance in session.query(Usuario).order_by(Usuario.id_usuario): 
            lista.append(instance)
        
        output = json.dumps({'success': False})
        if instance != None:
            for almacenado in lista:
                if almacenado.id_usuario == idUsuario:
                    session.delete(almacenado)
                    output = json.dumps({'success': True})
    return Response(output) 

def modificarUsuarios(request):
    post_data = request.POST
    if 'submit' in post_data:
        session = DBSession()
        lista=[]
        idUsuario = int(request.params['id'])         
        for instance in session.query(Usuario).order_by(Usuario.id_usuario): 
            lista.append(instance)
        
        output = json.dumps({'success': False})
        if instance != None:
            for almacenado in lista:
                if almacenado.id_usuario == idUsuario:
					almacenado.nombreUsuario = request.params['nombreUsuario']
					almacenado.nombre= request.params['nombre']
					almacenado.apellido= request.params['apellido']
					almacenado.telefono= request.params['telefono']
					almacenado.nroDocumento= request.params['nroDocumento']
					almacenado.mail= request.params['email']
					session.add(almacenado)
					output = json.dumps({'success': True})
    return Response(output)


def listarUsuarios(request):
	session = DBSession()
	lista= []
	for instance in session.query(Usuario).order_by(Usuario.nombre): 
		var= dict(id= instance.id_usuario, nombreUsuario=instance.nombreUsuario, nombre= instance.nombre, apellido= instance.apellido, telefono=instance.telefono, nroDocumento=instance.nroDocumento, email= instance.mail, fecha = instance.fechaCreacion.strftime("%d/%m/%y %H:%M:%S"))
		lista.append(var)


	output = json.dumps({'data':lista})
	return Response(output)

def crearRol(request):
    post_data = request.POST
    if 'submit' in post_data:
        nombreRol = post_data['nombreRol']
        descripcion = post_data['descripcion']
        transaction.begin()
        session = DBSession()
        rol = Rol(nombreRol, descripcion)
        session.add(rol)
        transaction.commit()
        output = json.dumps({'success': True})
    return Response(output) 

def eliminarRol(request):
    post_data = request.POST
    if 'submit' in post_data:
        session = DBSession()
        lista=[]
        idRol = int(request.params['id'])
        for instance in session.query(Rol).order_by(Rol.id_rol): 
            lista.append(instance)
        
        output = json.dumps({'success': False})
        if instance != None:
            for almacenado in lista:
                if almacenado.id_rol == idRol:
                    session.delete(almacenado)
                    output = json.dumps({'success': True})
    return Response(output) 

def modificarRol(request):
    post_data = request.POST
    if 'submit' in post_data:
        session = DBSession()
        lista=[]
        idRol = int(request.params['id'])        
        for instance in session.query(Rol).order_by(Rol.id_rol): 
            lista.append(instance)
        
        output = json.dumps({'success': False})
        if instance != None:
            for almacenado in lista:
                if almacenado.id_rol == idRol:
                    almacenado.nombreRol= request.params['nombreRol']
                    almacenado.descripcion= request.params['descripcion']
                    session.add(almacenado)
                    output = json.dumps({'success': True})
    return Response(output)
    
def listarRoles(request):
	session = DBSession()
	lista= []
	for instance in session.query(Rol).order_by(Rol.nombreRol): 
		var= dict(id=instance.id_rol, nombreRol=instance.nombreRol, descripcion=instance.descripcion, fecha = instance.fechaCreacion.strftime("%d/%m/%y %H:%M:%S"))
		lista.append(var)


	output = json.dumps({'data':lista})
	return Response(output)

def crearProyecto(request):
    post_data = request.POST
    if 'submit' in post_data:
        nombre = post_data['nombre']
        descripcion = post_data['descripcion']
        nroFases = post_data['nroFases']
        transaction.begin()
        session = DBSession()
        proyecto = Proyecto(nombre, descripcion, nroFases)
        session.add(proyecto)
        transaction.commit()
        output = json.dumps({'success': True})
    return Response(output) 

def eliminarProyecto(request):
    post_data = request.POST
    if 'submit' in post_data:
        session = DBSession()
        lista=[]
        idProyecto = int(request.params['id'])        
        for instance in session.query(Proyecto).order_by(Proyecto.id): 
            lista.append(instance)
        
        output = json.dumps({'success': False})
        if instance != None:
            for almacenado in lista:
                if almacenado.id == idProyecto:
                    session.delete(almacenado)
                    output = json.dumps({'success': True})
    return Response(output) 

def modificarProyecto(request):
    post_data = request.POST
    if 'submit' in post_data:
        session = DBSession()
        lista=[]
        idProyecto = int(request.params['id'])         
        for instance in session.query(Proyecto).order_by(Proyecto.id): 
            lista.append(instance)
        
        output = json.dumps({'success': False})
        if instance != None:
            for almacenado in lista:
                if almacenado.id == idProyecto:
					almacenado.nombre = request.params['nombre']
					almacenado.descripcion = request.params['descripcion']
					almacenado.nroFases = request.params['nroFases']
					session.add(almacenado)
					output = json.dumps({'success': True})
    return Response(output)


def listarProyectos(request):
	session = DBSession()
	lista= []
	for instance in session.query(Proyecto).order_by(Proyecto.nombre): 
		var= dict(id= instance.id, nombre=instance.nombre, descripcion=instance.descripcion, nroFases=instance.nroFases,fecha = instance.fechaCreacion.strftime("%d/%m/%y %H:%M:%S"), estado = instance.estado)
		lista.append(var)


	output = json.dumps({'data':lista})
	return Response(output)

def iniciarProyecto(request):
	session= DBSession()
	lista= []
	for instance in session.query(Proyecto).order_by(Proyecto.id):
		lista.append(instance)
	
	output = json.dumps({'success': False})
	for project in lista:
		if project.getNombre() == request.params['nombre'] and project.getEstado() != 'Iniciado':
			project.setEstado( 'Iniciado')
			session.add(project)
			output = json.dumps({'success': True})
	
	return Response(output)
	
	
def terminarProyecto(request):
	session= DBSession()
	lista= []
	for instance in session.query(Proyecto).order_by(Proyecto.id):
		lista.append(instance)
	
	output = json.dumps({'success': False})
	for project in lista:
		if project.getNombre() == request.params['nombre'] and project.getEstado() != 'Terminado':
			project.setEstado( 'Terminado')
			session.add(project)
			output = json.dumps({'success': True})
	
	return Response(output)
